/* 
 * File:   makefl.cpp
 * Author: Sergey Reymerov
 *
 * Created on 30 Ноябрь 2009 г., 17:00
 * makefl - make full library.
 * Эта программа создает полную библиотеку из найденных ранее.
 * Позволяет находить только библиотеки до 4-х переменных (включительно).
 * Она загружает библиотеку целиком и из нее создает целиком новую библиотеку.
 */
#include "DefineConfiguration.h"
#include "BooleanFunction.h"
#include "FullLibrary.h"
#include "LibraryInterface.h"
#include <iostream>
#include <sstream>
#include <string>

const UInt32 n = 3;
typedef LibraryInfo<n> CurLibInfo;


int main() {
    FullLibrary<CurLibInfo::pre> libraryPre;
    std::ostringstream filename;
    filename << LIBRARYDIRECTORIES << "/fulllibs/fulllibrary_" << CurLibInfo::pre::n << ".bin";
    libraryPre.load(filename.str());
    filename.str("");

    FullLibrary<CurLibInfo> library;

    UInt8 ts, ts1, ts2, ts3;
    UInt64 f1, f2, f1p, f2p;
    
    for(UInt64 f = 0; f < CurLibInfo::fC; f++) {
        ts = -1;
        f1p = (f >> (CurLibInfo::aC >> 1));
        f2p = (f & ~AttributeMask<CurLibInfo, 0>::value);
        for(UInt64 f3 = 0; f3 < CurLibInfo::pre::fC; f3++) {
            f1 = f3 ^ f1p;
            f2 = f3 ^ f2p;
            libraryPre.get(f1, ts1);
            libraryPre.get(f2, ts2);
            libraryPre.get(f3, ts3);

            if (ts1 + ts2 + ts3 < ts)
                ts = ts1 + ts2 + ts3;
        }
        library.set(f, ts);        
    }

    filename << LIBRARYDIRECTORIES << "/fulllibs/fulllibrary_" << CurLibInfo::n << ".bin";
    library.save(filename.str());
    
    return (0);
}

